/**
 * 범용적으로 사용할 수 있는 물체에 대한 모든(수많은) 속성을 정의한 클래스
 * 
 * 위치 : 3차원 좌표계로 평면 x, y축 에 높이(깊이)축 z 를 추가. 질량 : 물체의 질량. 적용단위 (g, kg, t)
 * 
 * @author sppurple
 * 
 */

public class GObject {
	private Point3D position;
	private Mass mass;
	private Point3D size;
	private Force force;
	//
	// Method
	//

	/**
	 * 객체의 외곽을 육면체로 감싸고 그 내부를 채우는 구의 직경을 리턴한다.
	 * 
	 * @param measure
	 *            단위("mm" : 밀리미터, "cm" : 센티미터, "m" : 미터, "km" : 킬로미터)
	 * @return 단위로 변경된 직경
	 */
	public double getDiameter(String measure) {
		double x = size.getX();
		double y = size.getY();
		double z = size.getZ();

		if (measure == "mm") {
			return Math.sqrt((x * x) + (y * y) + (z * z));
		} else if (measure == "cm") {
			return Math.sqrt((x * x) + (y * y) + (z * z)) / 10;
		} else if (measure == "m") {
			return Math.sqrt((x * x) + (y * y) + (z * z)) / 1000;
		} else if (measure == "km") {
			return Math.sqrt((x * x) + (y * y) + (z * z)) / 1000000;
		} else
			return -1;
	}

	/**
	 * 객체의 외곽을 육면체로 감싸고 그 내부를 채우는 구의 반경을 리턴한다.
	 * 
	 * @param measure
	 *            단위("mm" : 밀리미터, "cm" : 센티미터, "m" : 미터, "km" : 킬로미터)
	 * @return 단위로 변경된 반경
	 */
	public double getRadius(String measure) {
		return getDiameter(measure) / 2;
	}

	/**
	 * GObject 의 중앙 좌표를 리턴.
	 * 
	 * @return GObject 의 중앙좌표
	 */
	public Point3D getObjectCenter() {
		Point3D resultPoint3D = new Point3D();
		resultPoint3D.setX(getPosition().getX() + (getSize().getX() / 2));
		resultPoint3D.setY(getPosition().getY() + (getSize().getY() / 2));
		resultPoint3D.setZ(getPosition().getZ() + (getSize().getZ() / 2));
		return resultPoint3D;
	}

	//
	// Constructor
	//
	GObject() {
		position = new Point3D(0.0, 0.0, 0.0);
		mass = new Mass(0);
		size = new Point3D(0.0, 0.0, 0.0);
	}

	//
	// getter and setters
	//

	/**
	 * 지정한 단위로 변경된 물체의 질량을 리턴한다.
	 * 
	 * @param measure
	 *            단위("g" : 그램, "kg" : 킬로그램, "t" : 톤)
	 * @return 단위로 변경된 질량
	 */
	public double getMass(String measure) {

		if (measure == null)
			return -1;
		else if (measure.equals("g"))
			return this.mass.getMassPerGram();
		else if (measure.equals("kg"))
			return this.mass.getMassPerKilogram();
		else if (measure.equals("t"))
			return this.mass.getMassPerTon();
		else
			return -1;
	}

	/**
	 * 지정한 단위로 물체의 질량을 설정한다.
	 * 
	 * @param measure
	 *            단위("g" : 그램, "kg" : 킬로그램, "t" : 톤)
	 * @return 단위로 변경된 질량
	 */
	public void setMass(double mass, String measure) {
		if (measure == null)
			this.mass.setMassPerGram(-1);
		else if (measure.equals("g"))
			this.mass.setMassPerGram(mass);
		else if (measure.equals("kg"))
			this.mass.setMassPerKilogram(mass);
		else if (measure.equals("t"))
			this.mass.setMassPerTon(mass);
		else
			this.mass.setMassPerGram(-1);
	}

	public Point3D getPosition() {
		return position;
	}

	public void setPosition(Point3D position) {
		this.position = position;
	}

	public Point3D getSize() {
		return size;
	}

	public void setSize(Point3D size) {
		this.size = size;
	}
}
